#ifndef __NATSUME__Configuration_h__
#define __NATSUME__Configuration_h__

#include <cstddef>
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <vector>

namespace NATSUME {
    // ConfigArgs: 搜索引擎中的配置参数
    struct ConfigArgs {
        // 配置文件
        const std::string SETTING_CONF_PATH     = "conf/setting.conf";
        // 停用词词集名称
        const std::string STOP_WORD_PATH        = "STOP_WORD_PATH";
    };

    // 打印MAP容器中的数据
    template <typename COLL>
    void PRINT_ELEMENTS_PAIR(const COLL & coll) {
        for (const auto & it : coll) {
            std::cout << "[key]:\t" << it.first << "\t[value]:\t" << it.second << std::endl;
        }
        std::cout <<std::endl;
    }

    // 打印Vector, Set容器中的数据 (默认打印前3个元素)
    template <typename COLL>
    void PRINT_ELEMETNS(const COLL & coll, size_t numsizes = 3) {
        size_t  i = 0;
        for (const auto & elem : coll) {
            std::cout << elem << std::endl;
            ++i;
            if (i >= numsizes) {
                break;
            }
        }
        std::cout << std::endl;
    }

};

// Configuration: 配置文件类
class Configuration {
    public:
        // 传入文件路径filePath, 来构造Configuration类
        Configuration(const std::string & filePath);
        // 析构函数
        ~Configuration();

    public:
        // 获取配置文件内容
        std::map<std::string, std::string> &
        getconfigMap();
        // 获取停用词集合
        std::set<std::string> &
        getstopWordList();

    private:
        // 初始化配置文件内容
        void initconfigMap();
        // 初始化停用词集合
        void initstopWordList();

    public:
        NATSUME::ConfigArgs                     m_configArgs;

    private:
        // 配置文件路径
        std::string                             m_filePath;
        // 配置文件内容
        std::map<std::string, std::string>      m_configMap;
        // 停用词词集
        std::set<std::string>                   m_stopWordList;
};

#endif // __NATSUME__Configuration_h__